home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / gnulib / gbl-ctors.h < prev    next >
C/C++ Source or Header  |  1995-05-20  |  3KB  |  90 lines

  1. /* Definitions relating to the special __do_global_init function used
  2.    for getting g++ file-scope static objects constructed.  This file
  3.    wil get included either by gnulib2.c (for systems that don't support
  4.    a .init section) or by crtstuff.c (for those that do).
  5.  
  6.    Written by Ron Guilmette (rfg@ncd.com)
  7.  
  8. Copyright (C) 1991 Free Software Foundation, Inc.
  9.  
  10. This file is part of GNU CC.
  11.  
  12. GNU CC is free software; you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation; either version 2, or (at your option)
  15. any later version.
  16.  
  17. GNU CC is distributed in the hope that it will be useful,
  18. but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. GNU General Public License for more details.
  21.  
  22. You should have received a copy of the GNU General Public License
  23. along with GNU CC; see the file COPYING.  If not, write to
  24. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  25.  
  26. /*    This file contains definitions and declarations of things
  27.     relating to the normal start-up-time invocation of C++
  28.     file-scope static object constructors.  These declarations
  29.     and definitions are used by *both* gnulib2.c and by crtstuff.c.
  30.  
  31.     Note that this file should only be compiled with GCC.
  32. */
  33.  
  34. #ifdef sun
  35. extern void on_exit (void*, void*);
  36. #define ON_EXIT(FUNC,ARG) on_exit ((FUNC), (ARG))
  37. #else
  38. #ifdef HAVE_ATEXIT
  39. extern void atexit (void (*) (void));
  40. #define ON_EXIT(FUNC,ARG) atexit ((FUNC))
  41. #endif
  42. #endif
  43.  
  44. /*  Declare a pointer to void function type.  */
  45.  
  46. typedef void (*func_ptr) (void);
  47.  
  48. /* Declare the set of symbols use as begin and end markers for the lists
  49.    of global object constructors and global object descructors.  */
  50.  
  51. extern func_ptr __CTOR_LIST__[];
  52. extern func_ptr __CTOR_END__[];
  53. extern func_ptr __DTOR_LIST__[];
  54. extern func_ptr __DTOR_END__[];
  55.  
  56. /* Declare the routine which need to get invoked at program exit time.  */
  57.  
  58. extern void __do_global_dtors ();
  59.  
  60. /* Define a macro with the code which needs to be executed at program
  61.    start-up time.  This macro is used in two places in crtstuff.c (for
  62.    systems which support a .init section) and in one place in gnulib2.c
  63.    (for those system which do *not* support a .init section).  For all
  64.    three places where this code might appear, it must be identical, so
  65.    we define it once here as a macro to avoid various instances getting
  66.    out-of-sync with one another.  */
  67.  
  68. /* There are two formats for the table __CTOR_LIST__:
  69.    GNU ld: first word is number of pointers, followed by that many pointers.
  70.    ELF/COFF: first word is -1, followed by pointers up to __CTOR_END__.  */
  71.  
  72. #define DO_GLOBAL_CTORS_BODY                        \
  73. do {                                    \
  74.   int nptrs = *(int *)__CTOR_LIST__;                    \
  75.   ON_EXIT (__do_global_dtors, 0);                    \
  76.   if (nptrs != -1)                            \
  77.     {                                    \
  78.       int i;                                \
  79.       for (i = 1; i <= nptrs; i++)                    \
  80.     __CTOR_LIST__[i] ();                        \
  81.     }                                    \
  82.   else                                    \
  83.     {                                    \
  84.       func_ptr *p;                            \
  85.       for (p = __CTOR_LIST__ + 1; p < __CTOR_END__; )            \
  86.         (*p++) ();                            \
  87.     }                                    \
  88. } while (0)
  89.  
  90.